package com.william.jdbcplus.core.meta;

import com.william.jdbcplus.common.enums.IdType;
import com.william.jdbcplus.core.toolkit.Constants;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据库表反射信息
 */
@Data
@Setter(AccessLevel.PACKAGE)
@Accessors(chain = true)
public class TableInfo implements Constants {

    /**
     * 实体类型
     */
    private Class<?> entityType;

    /**
     * 表主键ID 类型
     */
    private IdType idType = IdType.INPUT;

    /**
     * 表名称
     */
    private String tableName;

    /**
     * 表描述
     */
    private String tableRemarks;

    /**
     * 表主键ID 字段名
     */
    private String keyColumn;

    /**
     * 表主键ID 属性名
     */
    private String keyProperty;

    /**
     * 主键长度
     */
    private int keySize;

    /**
     * 主键描述
     */
    private String keyRemarks;

    /**
     * 表主键ID 属性类型
     */
    private Class<?> keyType;

    /**
     * 表主键信息列表
     */
    private List<TablePkInfo> pkList = new ArrayList<>();

    /**
     * 表字段信息列表
     */
    private List<TableColumnInfo> columnList = new ArrayList<>();

    /**
     * 不可改变属性列表
     */
    private List<String> finalFieldList = new ArrayList<>();

    /**
     * 表索引信息列表
     */
    private List<TableIndexInfo> indexList = new ArrayList<>();

    /**
     * 表唯一键信息列表
     */
    private List<TableUkInfo> ukList = new ArrayList<>();

    /**
     * 外键信息列表
     */
    private List<TableFkInfo> fkList = new ArrayList<>();

    /**
     * 是否开启逻辑删除
     */
    private boolean logicDelete = false;

    public TableInfo(Class<?> entityType) {
        this.entityType = entityType;
    }

    /**
     * 设置逻辑删除
     */
    void setLogicDelete(boolean logicDelete) {
        if (logicDelete) {
            this.logicDelete = true;
        }
    }
}
